/**
  * @file scene.h
  * @brief Plik nagłówkowy z definicją klasy Scene.
  */
#ifndef SCENE_H
#define SCENE_H

#include <QWidget>
#include <QImage>
#include <QMouseEvent>
/**
  * @class Scene
  * @brief Definicja klasy reprezentującej scenę animacji 3D.
  * Instancja klasy typu Scene odpowiada za wyświetlanie animacji fali w widoku pseudo-3D.
  * Obiekt przyjmuje przez slot sPoints() tablicę kolorów ustawianą na zdjęcie typu QImage,
  * które jest rysowane na widget'cie w przeładowanej funkcji paintEvent().
  * Dodatkowo przeładowano również metodę mousePressEvent() w celu obsłużenia zmian pozycji
  * źródeł fali przy kliknięciu przycisków myszy.
  */
class Scene : public QWidget
{
    Q_OBJECT
	public:
		/**
		  * @param parent wskaźnik na rodzica
		  * @brief Konstruktor obiektu.
		  * @see Scene::Scene
		  */
		explicit Scene(QWidget *parent = 0);
		/**
		  * @param event wskaźnik na zdarzenie rysowania widgeta
		  * @brief funkcja generuje zdjęcie pojedynczej klatki fali z tablicy gen_pkt i rysuje je na widget'cie
		  * @see Scene::paintEvent
		  */
		void paintEvent(QPaintEvent *event);
		/**
		  * @return wygenerowane zdjęcie
		  * @brief Służy do zwrócenia wygenerowanej klatki animacji w celu zapisu do schowka lub pliku
		  * @see Scene::getImage
		  */
		QImage getImage() const;

    protected:
		/**
		  * @param event zdarzenie kliknięcia przycisku myszy
		  * @brief Przeładowana funkcja obsługująca zmianę pozycji źródeł w miejsce kursora myszy w chwili kliknięcia
		  * @see Scene::mousePressEvent
		  */
        void mousePressEvent (QMouseEvent * event);
    
	public slots:
		/**
		  * @param generated wygenerowana tablica kolorów dla pikseli zdjęcia
		  * @brief Funkcja ustawia tablicę kolorów dla zdjęcia fali i wymusza przerysowanie sceny
		  * @see Scene::sPoints
		  */
		void sPoints(const unsigned char* generated);
		/**
		  * @brief DEPRECATED
		  * Funkcja wymuszająca przerysowanie sceny. Zastąpiona przez sPoints(const unsigned char*).
		  * @see Scene::sSceneRepaint
		  */
        void sSceneRepaint();
	private:
		const unsigned char* gen_pkt;
        QImage image;
    
};

#endif // SCENE_H
